package com.xzh.springCloud.controller;

import com.xzh.springCloud.entity.Member;
import com.xzh.springCloud.entity.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

/**
 * @Author: zhiHong
 * @CreateTime: 2023-08-24 22:06
 * @Description: member 的 controller 类
 */
@RestController
@Slf4j
public class MemberConsumerController {
    // 定义一个基础的 member_service_provider_url 作为基础 url 地址，使用 shift + ctrl + u 完成大小写的快速切换
    /**
     * 1. MEMBER-SERVICE-PROVIDER 就是服务提供方[集群], 注册到 Eureka Server 的别名
     * 2. 也就是服务提供方[集群]对外暴露的名称为 MEMBER-SERVICE-PROVIDER
     * 3. MEMBER-SERVICE-PROVIDER 目前有两个可用域，如果我们想要实现负载均衡，那么我们需要
     * 使用在 RestTemplate 上添加 @LoadBalanced 注解赋予其负载均衡的能力，也就是自动使用某个算法选择使用服务
     * 默认是轮询算法
     */
    public static final String MEMBER_SERVICE_PROVIDER_URL = "http://MEMBER-SERVICE-PROVIDER";

    /**
     * 装配 RestTemplate
     */
    @Resource
    private RestTemplate restTemplate;

    /**
     * 添加 member 对象到数据库/表
     */
    @PostMapping("/member/consumer/save")
    public Result saveMember(@RequestBody Member member) {
        /**
         * 参数1：请求的 url
         * 参数2：携带参数
         * 参数3：返回对象类型
         * 踩坑点：使用 restTemplate.postForObject 传入的 member 对象会被拆为 json，所以我们需要添加 @RequestBody 并且使用 json 格式传参，同时 Member 类需要进行序列化操作
         */
        log.info("info = {}", member.toString());
        return restTemplate.postForObject(MEMBER_SERVICE_PROVIDER_URL + "/member/save/", member, Result.class);
    }

    @GetMapping("/member/consumer/get/{id}")
    public Result getMemberById(@PathVariable("id") Long id) {
        return restTemplate.getForObject(MEMBER_SERVICE_PROVIDER_URL + "/member/get/" + id, Result.class);
    }

}
